﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Collections;
using System.Windows.Media;

using Civilisation_code.PJoueur;
using Civilisation_code.PCarte;
using Civilisation_code.PInterfaces_Fabrique_Unite;
using Civilisation_code.PPartie;
using Civilisation_code.PRessource;
using Civilisation_code.Implementation_Unite_EII;
using Civilisation_code.Implementation_Unite_INFO;

namespace Tests
{
    [TestClass]
    public class TestCreationVillage
    {
        [TestMethod]
        public void TestNouveauVillageSimple()
        {
            //Premier test : création d'un simple village
            Monteur_Partie monteur = new Monteur_Partie_IMPL();

            Hashtable joueurs = new Hashtable();
            joueurs.Add("Flo", new Tuple<string, Color>("INFO", Colors.Blue));
            joueurs.Add("Nico", new Tuple<string, Color>("INFO", Colors.Red));

            monteur.genererPartie(joueurs, false);

            Joueur j1 = monteur._partie._joueurs[0];
            Joueur j2 = monteur._partie._joueurs[1];

            Case depart = monteur._partie._carte.getCase(10, 10);
            Case arrivee = monteur._partie._carte.getCase(10, 11);

            Fabrique_Unite_INFO.FABRIQUE_UNITE.creerEnseignant(depart, j1);

            Assert.AreEqual(1, depart.Unites.Count);
            Assert.IsNull(depart.Ville);

            ((Enseignant)depart.Unites[0]).creerVillage();

            Assert.AreEqual(0, depart.Unites.Count);
            Assert.IsNotNull(depart.Ville);

        }

        [TestMethod]
        public void TestNouveauVillageSurCaseAnnexee()
        {
            //Second test : on essaye de créer un village sur une case annexee
            Monteur_Partie monteur = new Monteur_Partie_IMPL();

            Hashtable joueurs = new Hashtable();
            joueurs.Add("Flo", new Tuple<string, Color>("INFO", Colors.Blue));
            joueurs.Add("Nico", new Tuple<string, Color>("INFO", Colors.Red));

            monteur.genererPartie(joueurs, false);

            Joueur j1 = monteur._partie._joueurs[0];
            Joueur j2 = monteur._partie._joueurs[1];

            Case depart = monteur._partie._carte.getCase(10, 10);
            Case arrivee = monteur._partie._carte.getCase(10, 11);

            Fabrique_Unite_INFO.FABRIQUE_UNITE.creerEnseignant(depart, j1);

            //Création du village
            Assert.AreEqual(1, depart.Unites.Count);
            Assert.IsNull(depart.Ville);

            ((Enseignant)depart.Unites[0]).creerVillage();

            Assert.AreEqual(0, depart.Unites.Count);
            Assert.IsNotNull(depart.Ville);

            //Annexion d'une case
            depart.Ville._cases_annexes.Add(arrivee);
            arrivee.Ville_annexee = depart.Ville;

            //On essaye de creer un village sur la case annexee
            Fabrique_Unite_INFO.FABRIQUE_UNITE.creerEnseignant(arrivee, j1);

            Assert.AreEqual(1, arrivee.Unites.Count);
            Assert.IsNull(arrivee.Ville);
            //Cette creation doit echouer
            ((Enseignant)arrivee.Unites[0]).creerVillage();
            //On doit donc retrouver les même valeurs qu'avant
            Assert.AreEqual(1, arrivee.Unites.Count);
            Assert.IsNull(arrivee.Ville);
        }

        [TestMethod]
        public void TestNouveauVillageSurVillageExistant()
        {
            //Troisième test : on essaye de créer un village sur une case contenant déjà un village
            Monteur_Partie monteur = new Monteur_Partie_IMPL();

            Hashtable joueurs = new Hashtable();
            joueurs.Add("Flo", new Tuple<string, Color>("INFO", Colors.Blue));
            joueurs.Add("Nico", new Tuple<string, Color>("INFO", Colors.Red));

            monteur.genererPartie(joueurs, false);

            Joueur j1 = monteur._partie._joueurs[0];
            Joueur j2 = monteur._partie._joueurs[1];

            Case depart = monteur._partie._carte.getCase(10, 10);
            Case arrivee = monteur._partie._carte.getCase(10, 11);

            Fabrique_Unite_INFO.FABRIQUE_UNITE.creerEnseignant(depart, j1);

            //Création du village
            Assert.AreEqual(1, depart.Unites.Count);
            Assert.IsNull(depart.Ville);

            ((Enseignant)depart.Unites[0]).creerVillage();

            Assert.AreEqual(0, depart.Unites.Count);
            Assert.IsNotNull(depart.Ville);


            //On essaye de creer un village sur la même case
            Fabrique_Unite_INFO.FABRIQUE_UNITE.creerEnseignant(depart, j1);

            Assert.AreEqual(1, depart.Unites.Count);
            //Cette creation doit echouer
            ((Enseignant)depart.Unites[0]).creerVillage();
            //On doit donc retrouver les même valeurs qu'avant
            Assert.AreEqual(1, depart.Unites.Count);

        }
    }
}
